使用 ARM 模板和 Terraform 进行多云基础设施即代码(第三部分):多云 GitOps





5.00/5 (1投票)
如何为多云管道添加自动化。
到目前为止,您已经了解了为什么企业正在采用多云基础设施以及如何通过 ARM 模板和 Terraform 部署一个。现在是时候为多云管道添加一些自动化了。
Azure Arc 的另一个重要部分是其基于 GitOps 的配置管理。它允许开发团队通过 Git 存储库轻松构建、部署、配置和管理全球分布式多云环境。
在本文中,我们将以前面的基础设施代码为基础,看看如何使用GitOps 原则来自动验证和部署本系列前一部分的多云基础设施。如果您需要前一篇文章中的代码作为起点,可以在此处下载。
我们将设置一个 GitHub 存储库,该存储库将使用 GitHub Actions 在代码推送时触发持续部署流程,以自动验证和部署我们的多云环境。
此存储库的完整代码在此处提供。
要求
要遵循本指南,您需要以下内容
- 一个 GitHub 账户
- 一个 Azure 订阅。如果您还没有,可以创建一个免费账户。
- 一个 DigitalOcean 账户
设置 GitHub 存储库
首先创建一个 新的 GitHub 存储库,用于保存我们的 Terraform 和 Bicep 文件。为 .gitignore 模板选择 Terraform 选项,以便存储库忽略额外的 Terraform 文件。
接下来,克隆该存储库,并将 main.bicep 和 main.tf 文件复制到 project 目录中,然后提交并将文件推送到 GitHub。不用担心,这不会触发任何部署,因为我们还没有配置任何 GitHub Actions。
Azure 和 DigitalOcean 的账户凭据
现在我们需要准备一些东西,以便 Terraform 能够正确部署。
在您的 Azure 账户中创建一个 armTest
资源组,并将其与已部署的虚拟机关联。可以通过运行此命令来完成
az group create –name armTest –location eastus
接下来,我们需要生成账户凭据供 GitHub Actions 使用来访问 Azure,因此让我们创建一个服务主体。
为此,您需要 Azure 订阅 ID。您可能已经从本系列的前面部分获得了此 ID,但如果您需要再次查找它,可以通过从资源组输出中复制它,或者运行 az account list
并从结果中找到 ID
来获取您的 Azure 订阅 ID。
使用订阅 ID 和 Azure Active Directory 命令来创建 GitHub Action 将使用的服务主体,方法是运行以下命令,将“YOUR-SUBSCRIPTION-ID
”替换为实际的订阅 ID
az ad sp create-for-rbac --name armTestSP --role Contributor
--scopes /subscriptions/YOUR-SUBSCRIPTION-ID
暂时将这些值保存在安全的地方,因为我们将在下一步中使用它们。
我们还需要另一个东西,即 DigitalOcean 个人访问令牌。如果您在本系列的前一部分中还没有,请遵循此指南,并将令牌保存在下一步中使用。
配置 GitHub Actions
接下来,我们将安全地将我们在 GitHub 存储库中检索到的 Azure 和 DigitalOcean 凭据存储为 GitHub Actions 机密。
打开存储库的 Settings(设置)页面,然后单击 Secrets(机密)展开选项,然后选择下面的 Actions(操作)导航到 Actions secrets(操作机密)页面。
将以下 Actions 机密添加到存储库
AZURE_SUBSCRIPTION_ID
— 您的 Azure 订阅 IDAZURE_AD_TENANT_ID
— 您服务主体的 Tenant 值AZURE_AD_APP_ID
— 您服务主体的 App ID 值AZURE_AD_APP_PASSWORD
— 您服务主体的 Password 值DO_TOKEN
— 您的 DigitalOcean 个人访问令牌ADMIN_PASSWORD
— 您希望为 Azure VM 设置的管理员密码
此时,“Actions secrets”(操作机密)页面应如下所示
最后,我们需要配置我们的 GitHub 存储库,使其包含一个 GitHub Action,在向存储库推送新更改时运行 Terraform。
导航到 Actions(操作)选项卡,搜索 Terraform 工作流模板,然后单击 Configure(配置)。
用以下代码替换 terraform.yml 文件的内容,该代码使用我们的 GitHub Actions 机密,添加了一个 Bicep 文件构建阶段来生成 ARM 模板,并将管理员密码和 DigitalOcean 访问令牌作为参数传递给 Terraform 进行部署。
name: 'Terraform'
on:
push:
branches:
- main
pull_request:
permissions:
contents: read
jobs:
terraform:
name: 'Terraform'
runs-on: ubuntu-latest
environment: production
env:
ARM_CLIENT_ID: ${{ secrets.AZURE_AD_APP_ID }}
ARM_CLIENT_SECRET: ${{ secrets.AZURE_AD_APP_PASSWORD }}
ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
ARM_TENANT_ID: ${{ secrets.AZURE_AD_TENANT_ID }}
defaults:
run:
shell: bash
steps:
- name: Checkout
uses: actions/checkout@v3
- name: bicep-build-output
uses: Azure/bicep-build-action@v1.0.0
with:
# Bicep main file path
bicepFilePath: main.bicep
# ARM template output path
outputFilePath: main.json
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
- name: Terraform Init
run: terraform init
- name: Terraform Validate
run: terraform validate -no-color
- name: Terraform Plan
run: terraform plan -input=false
-var "adminPasswordOrKey=${{ secrets.ADMIN_PASSWORD }}"
-var "do_token=${{ secrets.DO_TOKEN }}"
- name: Terraform Apply
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
run: terraform apply -auto-approve -input=false
-var "adminPasswordOrKey=${{ secrets.ADMIN_PASSWORD }}"
-var "do_token=${{ secrets.DO_TOKEN }}"
提交新的工作流文件,它将自动开始 GitHub Action。如果您想实时查看日志,可以打开 GitHub Action 并选择最近的 Terraform 作业。
如果配置正确,您的 Terraform 将成功部署到您的多云环境,并完成 GitHub Action。
测试您的多云环境
此时,您的虚拟机应该已成功部署到 Azure 和 DigitalOcean。
您可以通过运行 az resource list
--resource-group armTest
来快速检查您的 Azure VM,以查看资源是否存在。您的 DigitalOcean 仪表板也应该显示已部署的 droplet,允许您通过 Web 控制台登录。
就是这样!
清理
要清理我们的多云资源,我们可以在本地运行 terraform destroy。或者,我们可以提交并推送一个更新到 GitHub Action 工作流,该工作流将 terraform.yml 中的 terraform plan
和 terraform apply
阶段替换为以下代码片段,以运行 terraform destroy
命令
- name: Terraform Validate
run: terraform validate -no-color
- name: Terraform Destroy
run: terraform destroy -auto-approve -input=false
-var "adminPasswordOrKey=${{ secrets.ADMIN_PASSWORD }}"
-var "do_token=${{ secrets.DO_TOKEN }}"
# - name: Terraform Plan
# run: terraform plan -input=false
-var "adminPasswordOrKey=${{ secrets.ADMIN_PASSWORD }}"
-var "do_token=${{ secrets.DO_TOKEN }}"
#
# - name: Terraform Apply
# if: github.ref == 'refs/heads/main' && github.event_name == 'push'
# run: terraform apply -auto-approve -input=false
-var "adminPasswordOrKey=${{ secrets.ADMIN_PASSWORD }}"
-var "do_token=${{ secrets.DO_TOKEN }}"
在销毁 Terraform 之后,仍然最好检查资源是否已正确解除预配。
最后,我们在 Azure 账户上还有一些额外的清理步骤。
让我们通过运行 az group delete –name armTest
来删除 Azure 资源组。
同样,删除服务主体。通过运行 az ad sp list --display-name armTestSP
获取 armTestSP
服务主体的 ID,然后运行 az ad sp delete --id YOUR-SP-ID
。
下一步
在本系列中,您了解了多云的优势和挑战。您还学习了如何使用 Terraform 和 GitHub Actions 等技术,将现有的 Azure 基础架构代码(以 Bicep 和 ARM 模板形式)转换为支持多云基础设施。
虽然本系列可能在此结束,但您的多云之旅不必如此。请查看 Azure Arc 文档,以了解 Azure Arc 提供的所有其他技术的更多信息。祝您的云部署好运!
要详细了解如何在任何地方安全地保护、开发和操作基础设施、应用程序和 Azure 服务,请参阅我们的资源Azure Arc。